/*
 * @lc app=leetcode id=165 lang=cpp
 *
 * [165] Compare Version Numbers
 *
 * https://leetcode.com/problems/compare-version-numbers/description/
 *
 * algorithms
 * Medium (25.75%)
 * Likes:    394
 * Dislikes: 1294
 * Total Accepted:    164.6K
 * Total Submissions: 638.2K
 * Testcase Example:  '"0.1"\n"1.1"'
 *
 * Compare two version numbers version1 and version2.
 * If version1 > version2 return 1; if version1 < version2 return -1;otherwise
 * return 0.
 * 
 * You may assume that the version strings are non-empty and contain only
 * digits and the . character.
 * The . character does not represent a decimal point and is used to separate
 * number sequences.
 * For instance, 2.5 is not "two and a half" or "half way to version three", it
 * is the fifth second-level revision of the second first-level revision.
 * You may assume the default revision number for each level of a version
 * number to be 0. For example, version number 3.4 has a revision number of 3
 * and 4 for its first and second level revision number. Its third and fourth
 * level revision number are both 0.
 * 
 * 
 * 
 * Example 1:
 * 
 * Input: version1 = "0.1", version2 = "1.1"
 * Output: -1
 * 
 * Example 2:
 * 
 * Input: version1 = "1.0.1", version2 = "1"
 * Output: 1
 * 
 * Example 3:
 * 
 * Input: version1 = "7.5.2.4", version2 = "7.5.3"
 * Output: -1
 * 
 * Example 4:
 * 
 * Input: version1 = "1.01", version2 = "1.001"
 * Output: 0
 * Explanation: Ignoring leading zeroes, both “01” and “001" represent the same
 * number “1”
 * 
 * Example 5:
 * 
 * Input: version1 = "1.0", version2 = "1.0.0"
 * Output: 0
 * Explanation: The first version number does not have a third level revision
 * number, which means its third level revision number is default to "0"
 * 
 * 
 * 
 * Note:
 * 
 * Version strings are composed of numeric strings separated by dots . and this
 * numeric strings may have leading zeroes. 
 * Version strings do not start or end with dots, and they will not be two
 * consecutive dots.
 * 
 */

// @lc code=start

class Solution {
public:
    int compareVersion(string version1, string version2) {
        int i = 0;
        int j = 0;

        while (i < version1.size() || j < version2.size()) {
            int x = i;
            while (x < version1.size() && version1[x] != '.') ++x;

            int y = j;
            while (y < version2.size() && version2[y] != '.') ++y;

            int v1 = (x == i) ? 0 : atoi(version1.substr(i, x - i).c_str());
            int v2 = (y == j) ? 0 : atoi(version2.substr(j, y - j).c_str());
            

            if (v1 > v2) return 1;
            if (v1 < v2) return -1;

            i = x + 1;
            j = y + 1;
        }

        return 0;
    }
};

/* use stringstream
class Solution {
public:
    int compareVersion(string version1, string version2) {
        stringstream ss1(version1 + ".");
        stringstream ss2(version2 + ".");

        while (ss1.good() || ss2.good()) {
            int v1 = 0;
            int v2 = 0;
            char dot = '.';
            
            if (ss1.good()) ss1 >> v1 >> dot;
            if (ss2.good()) ss2 >> v2 >> dot;

            if (v1 > v2) return 1;
            if (v1 < v2) return -1;
        }

        return 0;
    }
};
*/

// @lc code=end

